]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell: Prime the GPUs property cache for switcheroo-control
authorBastien Nocera <hadess@hadess.net>
Tue, 3 Dec 2019 21:32:23 +0000 (22:32 +0100)
committerBastien Nocera <hadess@hadess.net>
Thu, 12 Dec 2019 23:44:28 +0000 (00:44 +0100)
See: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/781

src/shell-global.c

index d7cbbd61f3d8857a2b7f18998554f21dc720b34e..f3845277c3a73f8827f5359dfb3746dcf2113889 100644 (file)
@@ -125,6 +125,29 @@ G_DEFINE_TYPE(ShellGlobal, shell_global, G_TYPE_OBJECT);
 
 static guint shell_global_signals [LAST_SIGNAL] = { 0 };
 
+static void
+got_switcheroo_control_gpus_property_cb (GObject      *source_object,
+                                         GAsyncResult *res,
+                                         gpointer      user_data)
+{
+  ShellGlobal *global;
+  GError *error = NULL;
+  GVariant *gpus;
+
+  gpus = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
+                                        res, &error);
+  if (!gpus)
+    {
+      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        g_debug ("Could not get GPUs property from switcheroo-control: %s", error->message);
+      g_clear_error (&error);
+      return;
+    }
+
+  global = user_data;
+  g_dbus_proxy_set_cached_property (global->switcheroo_control, "GPUs", gpus);
+}
+
 static void
 switcheroo_control_ready_cb (GObject      *source_object,
                              GAsyncResult *res,
@@ -133,6 +156,7 @@ switcheroo_control_ready_cb (GObject      *source_object,
   ShellGlobal *global;
   GError *error = NULL;
   ShellNetHadessSwitcherooControl *control;
+  g_auto(GStrv) cached_props = NULL;
 
   control = shell_net_hadess_switcheroo_control_proxy_new_for_bus_finish (res, &error);
   if (!control)
@@ -146,6 +170,25 @@ switcheroo_control_ready_cb (GObject      *source_object,
   global = user_data;
   global->switcheroo_control = G_DBUS_PROXY (control);
   g_debug ("Got switcheroo-control proxy successfully");
+
+  cached_props = g_dbus_proxy_get_cached_property_names (global->switcheroo_control);
+  if (cached_props != NULL && g_strv_contains ((const gchar * const *) cached_props, "GPUs"))
+    return;
+
+  g_dbus_connection_call (g_dbus_proxy_get_connection (global->switcheroo_control),
+                          g_dbus_proxy_get_name (global->switcheroo_control),
+                          g_dbus_proxy_get_object_path (global->switcheroo_control),
+                          "org.freedesktop.DBus.Properties",
+                          "Get",
+                          g_variant_new ("(ss)",
+                                         g_dbus_proxy_get_interface_name (global->switcheroo_control),
+                                         "GPUs"),
+                          NULL,
+                          G_DBUS_CALL_FLAGS_NONE,
+                          -1,
+                          global->switcheroo_cancellable,
+                          got_switcheroo_control_gpus_property_cb,
+                          user_data);
 }
 
 static void